package datetime

import "time"

type theTime struct {
	unix int64
}

func NewUnixNow() *theTime {
	return &theTime{unix: GetNowTimestamp()}
}

func NewUnix(unix int64) *theTime {
	return &theTime{unix: unix}
}

// NewFormat 按照指定的格式解析时间
func NewFormat(t string) (*theTime, error) {
	loc := time.FixedZone("CST", 8*3600)
	tt, err := time.ParseInLocation(YearMouthDayHourMinuteSecond, t, loc)
	if err != nil {
		return nil, err
	}
	return &theTime{unix: tt.Unix()}, nil
}

// NewIso8601 解析iso8601格式的时间
// 2019-08-08T08:08:08Z
// 2019-08-08T08:08:08+08:00
func NewIso8601(iso8601 string) (*theTime, error) {
	t, err := time.ParseInLocation(time.RFC3339, iso8601, time.UTC)
	if err != nil {
		return nil, err
	}
	return &theTime{unix: t.Unix()}, nil
}

// ToUnix 返回unix时间戳
// 秒级
func (f *theTime) ToUnix() int64 {
	return f.unix
}

// ToFormat 返回指定格式的时间
// 2019-08-08 08:08:08
func (f *theTime) ToFormat() string {
	return time.Unix(f.unix, 0).Format(YearMouthDayHourMinuteSecond)
}

// ToFormatByTp 返回指定格式的时间
// tp: 格式模板
func (f *theTime) ToFormatByTp(tp string) string {
	return time.Unix(f.unix, 0).Format(tp)
}

// ToIso8601 返回iso8601格式的时间
// 2019-08-08T08:08:08Z
func (f *theTime) ToIso8601() string {
	return time.Unix(f.unix, 0).Format(time.RFC3339)
}
